package com.javafactroy.kunlong.base.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;

import java.util.Arrays;

/**
 * 日志通知
 * */
@Slf4j
//@Aspect
//@Component
@CrossOrigin
public class CommonLogAdvice {
    /**
     * 所有serviceClass的类的所有public方法
     */
  //  @Pointcut("execution(public * com.javafactroy.kunlong..*(..))")
    @Pointcut("@annotation(org.springframework.web.bind.annotation.ResponseBody)")
    public void serviceClass() {
    }

    // @Around("within(@org.springframework.stereotype.Service *)") //扫描所有@Service注解的下类中的所有的方法
    @Around("serviceClass()") //扫描所有@Service注解的下类中的所有的方法
    public Object handleExceptionLog(ProceedingJoinPoint jp) throws Throwable {

        try {
            // 记录方法进入日志，Signature包名+类名+方法名。Args方法的所有参数
            log.info("{}方法准备调用，参数: {}", jp.getSignature(), Arrays.toString(jp.getArgs()));
            long a = System.currentTimeMillis();
            // 调用切点方法（方法执行）
            Object result = jp.proceed();
            // 记录方法结束日志
            log.info("{}方法调用成功，执行耗时 {} ms", jp.getSignature(), System.currentTimeMillis() - a);
            return result;
        } catch (Throwable throwable) {
            log.error("{}方法执行失败，原因：{}", jp.getSignature(), throwable.getMessage(), throwable);
            throw throwable;
        }
    }
}